//============================================================================================
/**
 * @file	cursor_move.h
 * @brief	カーソル移動処理
 * @author	Hiroyuki Nakamura
 * @date	08.08.06
 */
//============================================================================================
#ifndef	CURSOR_MOVE_H
#define	CURSOR_MOVE_H

#include "gflib/touchpanel.h"


//============================================================================================
//	定数定義
//============================================================================================

typedef struct _CURSOR_MOVE_WORK	CURSOR_MOVE_WORK;		// 選択カーソル移動ワーク

// コールバック関数
// 第一引数 : CURSOR_MOVE_WORKに指定したコールバックに引き渡されるワーク
// 第二引数 : 現在のカーソル位置
// 第三引数 : 前回のカーソル位置
typedef struct {
	void (*on)(void*,int,int);		// カーソルが表示されたとき
	void (*off)(void*,int,int);		// カーソルが非表示になったとき
	void (*move)(void*,int,int);	// カーソルが移動したとき
	void (*touch)(void*,int,int);	// タッチされたとき
}CURSORMOVE_CALLBACK;

#define	CURSORMOVE_ONOFF_DIRECT	( 0xffffffff )	// CURSORMOVE_CursorOnOffSet()でコールバックに渡される引数

#define	CURSORMOVE_CURSOR_ON	( 0xfffffffc )	// カーソル表示
#define	CURSORMOVE_CURSOR_MOVE	( 0xfffffffd )	// 移動
#define	CURSORMOVE_CANCEL		( 0xfffffffe )	// キャンセル
#define	CURSORMOVE_NONE			( 0xffffffff )	// 動作なし

#define	CURSORMOVE_RETBIT		( 0x80 )		// カーソル移動で前回の位置へ戻る


//============================================================================================
//	プロトタイプ宣言
//============================================================================================

//--------------------------------------------------------------------------------------------
/**
 * 選択カーソル移動ワーク作成
 *
 * @param	rect		タッチ判定テーブル
 * @param	pw			カーソル位置ワーク
 * @param	func		コールバック関数
 * @param	work		コールバック関数に渡されるワーク
 * @param	cur_flg		カーソル表示フラグ
 * @param	cur_pos		カーソル位置
 * @param	heapID		ヒープID
 *
 * @return	カーソル移動ワーク
 *
 *	デフォルトはカーソルを常に表示
 */
//--------------------------------------------------------------------------------------------
extern CURSOR_MOVE_WORK * CURSORMOVE_Create(
					const RECT_HIT_TBL * rect,
					const POINTER_WORK * pw,
					const CURSORMOVE_CALLBACK * func,
					void * work,
					BOOL cur_flg,
					u8	cur_pos,
					u32 heapID );

//--------------------------------------------------------------------------------------------
/**
 * 選択カーソル移動ワーク解放
 *
 * @param	wk		カーソル移動ワーク
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
extern void CURSORMOVE_Exit( CURSOR_MOVE_WORK * wk );

//--------------------------------------------------------------------------------------------
/**
 * カーソルモードを非表示ありに設定
 *
 * @param	wk		カーソル移動ワーク
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
extern void CURSORMOVE_VanishModeSet( CURSOR_MOVE_WORK * wk );

//--------------------------------------------------------------------------------------------
/**
 * 選択カーソル移動（トリガ入力）
 *
 * @param	wk		カーソル移動ワーク
 *
 * @return	動作結果
 */
//--------------------------------------------------------------------------------------------
extern u32 CURSORMOVE_Main( CURSOR_MOVE_WORK * wk );

//--------------------------------------------------------------------------------------------
/**
 * 選択カーソル移動（ベタ入力）
 *
 * @param	wk		カーソル移動ワーク
 *
 * @return	動作結果
 *
 *	ボタン（Ａ、Ｂなど）はトリガ入力
 */
//--------------------------------------------------------------------------------------------
extern u32 CURSORMOVE_MainCont( CURSOR_MOVE_WORK * wk );

//--------------------------------------------------------------------------------------------
/**
 * カーソル位置取得
 *
 * @param	wk		カーソル移動ワーク
 *
 * @return	カーソル位置
 */
//--------------------------------------------------------------------------------------------
extern u8 CURSORMOVE_PosGet( CURSOR_MOVE_WORK * wk );

//--------------------------------------------------------------------------------------------
/**
 * カーソル記憶位置取得
 *
 * @param	wk		カーソル移動ワーク
 *
 * @return	カーソル記憶位置
 */
//--------------------------------------------------------------------------------------------
extern u8 CURSORMOVE_SavePosGet( CURSOR_MOVE_WORK * wk );

//--------------------------------------------------------------------------------------------
/**
 * カーソル位置設定
 *
 * @param	wk		カーソル移動ワーク
 * @param	pos		位置
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
extern void CURSORMOVE_PosSet( CURSOR_MOVE_WORK * wk, u8 pos );

//--------------------------------------------------------------------------------------------
/**
 * カーソル位置設定（拡張版）
 *
 * @param	wk			カーソル移動ワーク
 * @param	pos			位置
 * @param	old_pos		前回の位置
 * @param	save_pos	記憶位置
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
extern void CURSORMOVE_PosSetEx( CURSOR_MOVE_WORK * wk, u8 new_pos, u8 old_pos, u8 save_pos );

//--------------------------------------------------------------------------------------------
/**
 * カーソル表示状態取得
 *
 * @param	wk		カーソル移動ワーク
 *
 * @retval	"TRUE = 表示"
 * @retval	"FALSE = 非表示"
 */
//--------------------------------------------------------------------------------------------
extern BOOL CURSORMOVE_CursorOnOffGet( CURSOR_MOVE_WORK * wk );

//--------------------------------------------------------------------------------------------
/**
 * カーソル表示状態設定
 *
 * @param	wk		カーソル移動ワーク
 * @param	flg		TRUE = ON, FALSE = OFF
 *
 * @return	none
 *
 * @li	表示をONにした場合、前回の位置と記憶位置は初期化されます
 * @li	コールバックのold_posにはCURSORMOVE_ONOFF_DIRECTが渡されます
 */
//--------------------------------------------------------------------------------------------
extern void CURSORMOVE_CursorOnOffSet( CURSOR_MOVE_WORK * wk, BOOL flg );

//--------------------------------------------------------------------------------------------
/**
 * カーソル移動テーブル初期化
 *
 * @param	wk		カーソル移動ワーク
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
extern void CURSORMOVE_MoveTableInit( CURSOR_MOVE_WORK * wk );

//--------------------------------------------------------------------------------------------
/**
 * カーソル移動テーブル設定
 *
 * @param	wk		カーソル移動ワーク
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
extern void CURSORMOVE_MoveTableSet( CURSOR_MOVE_WORK * wk, u32 * tbl );

//--------------------------------------------------------------------------------------------
/**
 * 特定の位置をカーソル移動不可にする
 *
 * @param	wk		カーソル移動ワーク
 * @param	pos		位置
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
extern void CURSORMOVE_MoveTableBitOff( CURSOR_MOVE_WORK * wk, u32 pos );

//--------------------------------------------------------------------------------------------
/**
 * 特定の位置をカーソル移動可にする
 *
 * @param	wk		カーソル移動ワーク
 * @param	pos		位置
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
extern void CURSORMOVE_MoveTableBitOn( CURSOR_MOVE_WORK * wk, u32 pos );

//--------------------------------------------------------------------------------------------
/**
 * カーソル位置データ取得
 *
 * @param	wk		カーソル移動ワーク
 * @param	pos		カーソル位置
 *
 * @return	カーソル位置データ
 */
//--------------------------------------------------------------------------------------------
extern const POINTER_WORK * CURSORMOVE_PointerWorkGet( CURSOR_MOVE_WORK * wk, u32 pos );

//--------------------------------------------------------------------------------------------
/**
 * カーソル移動データ切り替え
 *
 * @param	wk			カーソル移動ワーク
 * @param	rect		タッチ判定テーブル
 * @param	pw			カーソル位置ワーク
 * @param	cur_pos		カーソル位置
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
extern void CURSORMOVE_SceneChange(
				CURSOR_MOVE_WORK * wk, const RECT_HIT_TBL * rect, const POINTER_WORK * pw, u8 cur_pos );


#endif	// CURSOR_MOVE_H